package rdd.operate;


import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Spark36_Operate_map {
    public static void main(String[] args) {
        final List<Integer> nums = Arrays.asList(1,2,3,4);
        //使用set对List集合进行修改
        for(int i = 0 ; i < nums.size() ; i ++){
            nums.set(i , nums.get(i) * 2);
        }
        nums.forEach(System.out::println);

        //使用add方法进行，产生新的对象
        List<Integer> nums1 = Arrays.asList(1,2,3,4);
        List<Integer> nums2 = new ArrayList<>();
        for(int i = 0 ; i < nums.size() ; i ++){
            nums2.add(nums1.get(i) * 2);
        }
        nums2.forEach(System.out::println);

        //使用rdd的map对数据进行处理
        final SparkConf conf = new SparkConf();
        conf.setMaster("local");
        conf.setAppName("spark");
        final JavaSparkContext jsc = new JavaSparkContext(conf);
        final JavaRDD<Integer> rdd = jsc.parallelize(nums,2);
        final JavaRDD<Integer> newrdd = rdd.map(new Function<Integer, Integer>() {          //这里的map就是做数据的转换，和scala中的map一样，两个参数代表传入值的类型和输出值的类型
            @Override
            public Integer call(Integer in) throws Exception {
                return in * 2 ;
            }
        });
        newrdd.collect().forEach(System.out::println);

        //进入map中的Function发现，有一个备注@FunctionInterface，说明这个是函数式接口，那么在java中可以使用lambal表达式进行简化
        final JavaRDD<Integer> newrdd1 = rdd.map(          //这里的map就是做数据的转换，和scala中的map一样，两个参数代表传入值的类型和输出值的类型
                (num) -> {
                   return num * 2;
                }

        );

//        还能精简
        final JavaRDD<Integer> newrdd2 = rdd.map(
                num -> num * 2

        );

        //继续精简，把参数和箭头都省略，需要通过对象传入方法进行
        final JavaRDD<Integer> newrdd3 = rdd.map(
            NumberTest::mul2
        );

        newrdd1.collect().forEach(System.out::println);
        newrdd2.collect().forEach(System.out::println);
        newrdd3.collect().forEach(System.out::println);
        jsc.close();
    }
}

class NumberTest{
    public  static int mul2(Integer num){
        return num * 2 ;
    }
}